package nb.diskfilesystem.controller;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import nb.diskfilesystem.Directory_Node;
import nb.diskfilesystem.DiskManage;
import nb.diskfilesystem.FATManage;


import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class FileEditorController {

    @FXML
    private Label fileNameLabel;
    @FXML
    private Label startBlocksLabel;
    @FXML
    private Label fileLengthLabel;
    @FXML
    private TextArea textArea;
    @FXML
    private Button saveButton;

    private Directory_Node currentNode;

    public void setDirectoryEntry(Directory_Node currentNode) {
        this.currentNode=currentNode;
        initializeControls(); // 设置目录项后初始化控件
    }

    // 用于初始化控件的方法
    public void initializeControls() {
        if (currentNode != null) {
            // 设置文件名    将字节数组转换为Base64编码的字符串，可以使用Base64类。
            fileNameLabel.setText("文件名："+ new String(currentNode.getFile_Name(), StandardCharsets.UTF_8));
            // 设置文件长度
            fileLengthLabel.setText(String.valueOf("文件长度："+(int)currentNode.getLength()));
            startBlocksLabel.setText(String.valueOf("起始块号："+(int)currentNode.getStartBlock()));
            // 假设 textArea 用于显示文件内容，这里只是示例，实际应从文件读取
            byte[] content= FATManage.getFileContent(currentNode.getStartBlock());    //根据文件的起始块来获取该文件存储的所有内容
            textArea.setText(new String(content, StandardCharsets.UTF_8));
        }
    }

    //保存文件内容，要转换为字节数组，还要根据字节数组写入空闲块，然后对应的fat表也要修改，目录项也要修改起始块啊文件长度啊，还有node节点也要修改
    @FXML
    private void handleSave() {
        // 获取TextArea中的内容
        String content = textArea.getText();
        byte[] utf8Bytes = content.getBytes(StandardCharsets.UTF_8);  //转换为utf8byte数组

        //第一步先把该节点所占据的空闲块都释放掉 此时fat表也已经被注释掉了
        FATManage.freeFileContent(currentNode.getStartBlock());

        //第二步将文件内容存储到对应的块
        int startblock=FATManage.saveFileContent(utf8Bytes);

        //更新文件夹那一块的那一列中的起始块还有文件长度
        Directory_Node parentNode=currentNode.getParent();
        int parentStatBlock=parentNode.getStartBlock();
        byte[] fullArray = DiskManage.readBlock(parentStatBlock);
        byte[] searchArray = currentNode.toByteArray();

        int filelength=utf8Bytes.length/64;
        if(utf8Bytes.length%64!=0){
            filelength++;
        }
        System.out.println("数组长度"+filelength);
        // 遍历64字节数组，每次取8个字节与搜索数组比较
        int column=-1;
        for (int i = 0; i < 64; i += 8) {
            // 提取8字节的子数组
            byte[] subArray = new byte[8];
            System.arraycopy(fullArray, i, subArray, 0, 8);
            // 比较子数组与搜索数组
            if (java.util.Arrays.equals(subArray, searchArray)) {
                // 计算列号（索引除以8）
                column = i / 8;
                System.out.println("找到匹配，在第 " + column + " 列");
                // 如果只需要找到第一个匹配项，可以在这里break
                // break;
            }
        }
        if(column==-1){
            return;
        }
        DiskManage.writeOnlyByte(parentStatBlock,column,6,(byte)startblock);
        DiskManage.writeOnlyByte(parentStatBlock,column,7,(byte)filelength);
        //先算出是在哪一列
        //更新目录节点起始块还有文件长度
        currentNode.setStartBlock((byte)startblock);   //起始块设置
        currentNode.setLength((byte)filelength);

        // 设置文件长度
        fileLengthLabel.setText(String.valueOf("文件长度："+(int)currentNode.getLength()));
        System.out.println("保存文件成功");


        // 更新FAT表显示
        FATManage.updateFATTable();

        // 更新磁盘块视图
        MainController mainController = (MainController) MainController.rootNode.getScene().getUserData();
        if (mainController != null) {
            mainController.updateBlockView();
        }


    }


}